

/*-------------------------------------------------------------------------
 *
 * datum.h
 *	  POSTGRES Datum (抽象数据类型) 操作例程。
 *
 * 这些例程由 'typbyval' 和 'typlen' 信息驱动，
 * 这些信息必须事先由调用者为 Datum 的数据类型获取。
 * (我们这样做是因为在大多数情况下，调用者
 * 只需查找一次信息并将其用于许多每个 datum 的操作。)
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/utils/datum.h
 *
 *-------------------------------------------------------------------------
 */
#ifndef DATUM_H
#define DATUM_H

/*
 * datumGetSize - 查找datum的“真实”长度
 */
extern Size datumGetSize(Datum value, bool typByVal, int typLen);

/*
 * datumCopy - 复制一个非NULL的datum。
 *
 * 如果数据类型是按引用传递，则使用palloc()获取内存。
 */
extern Datum datumCopy(Datum value, bool typByVal, int typLen);

/*
 * datumTransfer - 将一个非NULL的datum转移到当前内存上下文中。
 *
 * 在处理读写扩展对象时与datumCopy()不同。
 */
extern Datum datumTransfer(Datum value, bool typByVal, int typLen);

/*
 * datumIsEqual
 * 如果两个相同类型的datum相等则返回真，否则返回假。
 *
 * XXX：请查看代码中的注释以获取限制！
 */
extern bool datumIsEqual(Datum value1, Datum value2,
						 bool typByVal, int typLen);

/*
 * datum_image_eq
 *
 * 基于字节图像比较两个datum的内容是否相同。如果两个datum相等，则返回真，否则返回假。
 */
extern bool datum_image_eq(Datum value1, Datum value2,
						   bool typByVal, int typLen);

/*
 * datum_image_hash
 *
 * 根据其位生成'value'的哈希值，而不是逻辑值。
 */
extern uint32 datum_image_hash(Datum value, bool typByVal, int typLen);

/*
 * 序列化和恢复datum，以便我们可以将其传输到并行
 * 工作进程。
 */
extern Size datumEstimateSpace(Datum value, bool isnull, bool typByVal,
							   int typLen);
extern void datumSerialize(Datum value, bool isnull, bool typByVal,
						   int typLen, char **start_address);
extern Datum datumRestore(char **start_address, bool *isnull);

#endif							/* DATUM_H */
